# docker swarm COMMAND

容器集群管理器,使用户可以很容易地部署跨主机的容器集群服务。采用"主从"结构,通过Raft协议在多个管理节点实现共识。工作节点上运行agent接受管理节点的统一管理和任务分配,用户提交服务请求只需要发给管理节点即可,管理节点会按照调度策略在集群中分配节点来运行服务相关的任务。

manager-worker

# 1 基本概念

# 1.1 Swarm集群(Cluster)

​ Swarm集群(Cluster)为一组被统一管理起来的docker主机。集群是swarm所管理的对象。主机之间通过docker引擎的swarm模式沟通,管理节点(可以有多个)响应外部请求,工作节点运行docker容器,同一个主机可以同时为管理节点和工作节点。

​ Swarm集群使用:定义服务(指定状态、复制个数、网络、存储、暴露端口等)->管理节点发出启动服务的指令->管理节点按服务规则调度->在集群中启动整个服务并确保正常运行

# 1.2 节点(Node)

节点(Node)是swarm集群的最小资源单位,每个节点其实就是一台docker主机。

节点分为:

  1. 管理节点(manager node): 负责对外,管理集群中资源,分发任务给工作节点。多个管理节点通过Raft协议构成共识,所以管理节点数推荐奇数。
  2. 工作节点(worker node):负责执行管理节点安排的具体任务。默认情况下,管理节点也是工作节点。工作节点运行代理(agent)来汇报任务完成情况。
# 1.3 服务(Service)

服务(service)是docker支持复杂多容器协作场景的利器。

  • 服务由若干任务组成,每个任务为某个具体的应用。
  • 服务类型有两种,可以通过-mode指定:
    • 复制服务(replicated services)模式:默认模式,每个任务存在若干副本,用-replicas参数设置副本数量。
    • 全局服务(global services)模式:调度器将在每个可用节点都执行一个相同的任务,一般用来运行节点的检查或应用监控之类的
# 1.4 任务(Task)

​ 任务是Swarm集群中最小的调度单位,即一个指定的应用容器。生命周期:创建(new)->等待(penging)->分配(assigned)->接受(accepted)->准备(preparing)->开始(starting)->运行(running)->完成(complete)->失败(failed)->关闭(shutdown)->拒绝(rejected)->孤立(orphaned)

​ 任务分配到工作节点后,不再支持迁移。

# 1.5 服务的外部访问

​ 外部通过端口映射来访问集群中的服务。SWarm中支持入口负载均衡(ingress load balancing)的映射模式。此模式下,每个服务都会被分配一个公开端口(PublishedPort),该端口在集群中任意节点都可以访问到。

​ 当有请求发送到任意节点的公开端口时,该节点若没有实现执行服务相关的容器,会通过路由机制将请求转发给实际执行服务容器的工作节点。

# 2 使用swarm

# 2.1 集群命令
  • docker swarm ca:显示或旋转(更换)根CA
  • docker swarm init:初始化集群。
  • docker swarm join-token:管理tokens(manager|worker)。
  • docker swarm join:添加新节点到集群。
  • docker swarm leave:离开集群
  • docker swarm unlock-key:管理unlock key
  • docker swarm unlock:unlock集群
  • docker swarm update:update集群
# 2.2 集群命令详解
# 2.2.1 docker swarm ca
  • 格式

    # docker swarm ca [options]
    #查看ca
    docker swarm ca
    #更换ca
    docker swarm ca --rotate
    
    
  • 选项

    1. --ca-cert 指定集群根CA certificate证书的路径。
    2. --ca-key 指定集群根CA key证书的路径。
    3. --cert-expiry ca证书的有效期(ms|us|ms|s|m|h),默认值2160h。
    4. --detach, -d 立即退出而不待待
    5. --external-ca 一个或多个签名端点规范
    6. --quiet, -q 关闭进度输出
    7. --rotate 旋转(更换)CA证书,如果不提供将重新生成
# 2.2.2 docker swarm init
  • 格式

    # docker swarm init [options]
    docker swarm init
    
    docker swarm init --advertise-addr 192.168.100.201
    
  • 选项

    1. --advertise-addr 广播地址(格式:<ip|interface>[:port])
    2. --autolock 启用管理器自动锁(要求解密key来启动已停止的管理器)
    3. --availability 节点的可用性("active"(default)|"pause"|"drain")
    4. --cert-expiry 节点证书有效期(ns|us|ms|s|m|h)(default:2160h0m0s)
    5. --listen-addr 监听地址(格式:<ip|interface>[:port]),default:0.0.0.0:2377
    6. --data-path-addr
    7. --data-path-port
    8. default-addr-pool
    9. --default-addr-pool-mask-length
    10. dispatcher-heartbeat
    11. --external-ca
    12. --force-new-cluster
    13. --max-snapshots
    14. --snapshot-interval
    15. --task-history-limit
# 2.2.3 docker swarm join-token
  • 格式

    # 管理join tokens
    # docker swarm join-token [options] (worker|manager)
    #查看worker join token
    docker swarm join-token worker
    #查看manager join token
    docker swarm join-token manager
    #更换worker join token 
    docker swarm join-token --rotate worker
    #更换manager join-token 
    docker swarm join-token --rotate manager
    #只显示worker join token
    docker swarm join-token -q worker
    #只显示manager join token
    docker swarm join-token -q worker
    
  • 选项

    1. --quiet, -q 只显示token
    2. --rotate Rotate join token
# 2.2.4 docker swarm join
  • 格式

    # 以manager或worker身份加入群集
    # docker swarm join [options] host:port
    docker swarm join --token SWMTKN-1-2bprkl8eajkzcf81lnvcj9fvoerk7z4umx5dgw1kkmiv9nisar-bmgd5bz0o42qexg6lgv31vpg5 10.16.0.104:2377
    
  • 选项

    1. --advertise-addr 广播地址(格式:<ip|interface>[:port])
    2. --availability 节点的可用性("active"(default)|"pause"|"drain")
    3. --data-path-addr 数据流量使用的地址或网卡接口(格式:<ip|interface>)
    4. --listen-addr 监听地址(format:<ip|interface>[:port]),默认值:0.0.0.0:2377
    5. --token 加入集群的token(根据token自动识别是manager|worker)
# 2.2.5 docker swarm leave
  • 格式

    # 离开集群
    # docker swarm leave [options]
    # 如果是manager要离开,先把manager降为worker再离开
    docker node demote
    docker swarm leave
    
  • 选项

    1. --force, -f 强制离开集群(一般不用)
# 2.2.6 docker swarm unlock-key
  • 格式

    # 管理unlock key,只在manager执行
    # docker swarm unlock-key [options]
    #view unlock key
    docker swarm unlock-key
    #only view unlock key
    docker swarm unlock-key -q
    #rotate manager unlock key
    docker swarm unlock-key --rotate
    
  • 选项

    1. --quiet, -q 只显示key
    2. --rotate Rotate unlock key
# 2.2.7 docker swarm unlock
  • 格式

    # 用unlock key解锁一个锁定的manager,只在manager执行
    # docker swarm unlock
    docker swarm unlock
    Please enter unlock key:
    
# 2.2.8 docker swarm update
  • 格式

    #更新集群配置
    # docker swarm update [options]
    docker swarm update --cert-expiry 7200h
    docker swarm update --autolock false
    
  • 选项

    1. --autolock 更改manager的autolock设置(true|false)
    2. --cert-expiry 设置节点证书的有效期(ns|us|ms|s|m|h),default:2160h0m0s
    3. --dispatcher-heartbeat 设置调度器的心中周期(ns|us|ms|s|m|h),default:5s
    4. --external-ca 一个或多个证书签名端点的规范
    5. --max-snapshots 要保留的额外Ratf快照数
    6. --snapshot-interval Raft快照之间的日志条目数量,默认10000
    7. --task-history-limit 任务历史保留限制,默认5